/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.operativa;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.domain.BaseController;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.BeanDireccion;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.GeoUbicacionClient;
import co.gov.medellin.sdep.sisdep.model.OperDesmonteRet;
import co.gov.medellin.sdep.sisdep.operativa.exception.DesElementoRetenidoException;
import co.gov.medellin.sdep.sisdep.operativa.exception.OperDesmonteRetException;
import co.gov.medellin.sdep.sisdep.operativa.exception.OperDesmonteRetRuntimeException;
import co.gov.medellin.sdep.sisdep.operativa.service.IDesElementoRetenidoService;
import co.gov.medellin.sdep.sisdep.operativa.service.IOperDesmonteRetService;

/**
 * @author acespedes
 * 
 */
public class OperDesmonteRetController extends BaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/** bean para el manejo del formulario de busqueda OperDesmonteRet */
	private OperDesmonteRet operdesmonteretSearch = new OperDesmonteRet();

	/** Objeto contenedor del listado de OperDesmonteRet luego de una consulta. */
	private transient DataModel operdesmonteretListModel;

	/** bean para el manejo del formulario de creacion/edicion. OperDesmonteRet */
	private OperDesmonteRet operdesmonteret = new OperDesmonteRet();

	/** instancia de servicio operdesmonteretService */
	private IOperDesmonteRetService operdesmonteretService;

	/**
	 * instancia del servicio deselementoretenidoService
	 */
	private IDesElementoRetenidoService deselementoretenidoService;

	/**
	 * Controlador del detalle elementos.
	 */
	private DesElementoRetenidoController deselementoretenidoController;

	/**
	 * Cliente consumidor del web service de georeferenciacion
	 */
	private GeoUbicacionClient geoUbicacionClient;

	/**
	 * instancia un objeto de direccion local, en caso que el usuario no valide
	 * direccion al menos una vez
	 */
	private BeanDireccion direccionLocal = new BeanDireccion();

	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public OperDesmonteRetController() {
		this.operdesmonteretListModel = new ListDataModel();
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * 
	 * @return
	 */
	public String checkAddress() {
		direccionLocal = getGeoUbicacionClient().getAddressLocalization(
				this.operdesmonteret.getDireccionRetencion());
		if (null == direccionLocal) {
			direccionLocal = new BeanDireccion();
		}
		operdesmonteret.setCodigoBarrio(OracleHelper
				.isNullorEmpty(direccionLocal.getCodBarrio()) ? "N/A"
				: direccionLocal.getCodBarrio());
		operdesmonteret.setBarrio(OracleHelper.isNullorEmpty(direccionLocal
				.getValueNomBarrio()) ? "NO Disponible" : direccionLocal
				.getValueNomBarrio());
		operdesmonteret.setCodigoComuna(OracleHelper
				.isNullorEmpty(direccionLocal.getCodComuna()) ? "N/A"
				: direccionLocal.getCodComuna());
		operdesmonteret.setComuna(OracleHelper.isNullorEmpty(direccionLocal
				.getValueNomComuna()) ? "NO Disponible" : direccionLocal
				.getValueNomComuna());

		return "";
	}

	/**
	 * limpia el contenido de los valores que se ingresan para buscar
	 */
	public final void cleanSearchValues() {
		operdesmonteretSearch.setCodigo("");
		operdesmonteretSearch.setFechaInicio(null);
		operdesmonteretSearch.setFechaFin(null);
		operdesmonteretSearch.setIdTipoDesmonteStr("");

		if (this.operdesmonteretListModel.getWrappedData() != null) {
			((List) this.operdesmonteretListModel.getWrappedData()).clear();
		}

		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.clearMessage();
	}

	/**
	 * limpia el contenido de los valores que se ingresan (Create, Update)
	 */
	public final void cleanValues() {
		operdesmonteret.setId(null);
		operdesmonteret.setCodigo("");
		operdesmonteret.setDireccionRetencion("");
		operdesmonteret.setIdTipoInfraccion(new Long(0L));
		operdesmonteret.setIdTipoDesmonte(new Long(0L));
		operdesmonteret.setIdTipoVenta(new Long(0L));
		operdesmonteret.setHora("");
		operdesmonteret.setLugar("");
		operdesmonteret.setIdPermisoDep(null);
		operdesmonteret.setNombreEncargadoBodega("");
		operdesmonteret.setNombreInfractor("");
		operdesmonteret.setNombreResponsable("");
		operdesmonteret.setHora("");
		operdesmonteret.setObservaciones("");
		operdesmonteret.setFechaRegistro(null);
		operdesmonteret.setEstado("");

		if (this.operdesmonteretListModel.getWrappedData() != null) {
			((List) this.operdesmonteretListModel.getWrappedData()).clear();
		}
	}

	/**
	 * 
	 * @return String
	 */
	public String searchOperDesmonteRetByKey() {
		String msg = "";
		try {
			List valores = null;
			valores = getOperdesmonteretService().load(1, 10,
					this.operdesmonteretSearch);
			this.operdesmonteretListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.operdesmonteretListModel.getWrappedData() == null) {
			msg = AppConstants.NO_RECORDS_FOUND;
		} else {
			if (((List) this.operdesmonteretListModel.getWrappedData())
					.isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.OPERDESMONTERET_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return String
	 */
	public String searchByParametersDinamycally() {
		String msg = "";
		try {
			List valores = null;
			this.operdesmonteretSearch.setIdTipoDesmonte(new Long(
					this.operdesmonteretSearch.getIdTipoDesmonteStr()));
			valores = getOperdesmonteretService()
					.searchByParametersDinamycally(this.operdesmonteretSearch);
			this.operdesmonteretListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.operdesmonteretListModel.getWrappedData() == null) {
			msg = AppConstants.NO_RECORDS_FOUND;
		} else {
			if (((List) this.operdesmonteretListModel.getWrappedData())
					.isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.OPERDESMONTERET_SEARCH_VIEW;
	}

	/**
	 * Metodo que permite espeficicar la funcionalidad para la gestion [Crear /
	 * Actualizar] de un elmento tipo: OperDesmonteRet.
	 * 
	 * @author programador.java@consult-soft.com 05-06-2012
	 * @return String Vista a la cual debe retornar
	 * 
	 */
	public String manage() {
		String returnView = AppConstants.OPERDESMONTERET_SEARCH_VIEW;
		if (this.operdesmonteret.getId() == null) {
			returnView = create();
		} else {
			returnView = update();
		}
		return returnView;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.operdesmonteret.getId() == null) {

				this.operdesmonteret.setIdTipoDesmonte(new Long(
						this.operdesmonteret.getIdTipoDesmonteStr()));
				this.operdesmonteret.setIdTipoVenta(new Long(
						this.operdesmonteret.getIdTipoVentaStr()));
				this.operdesmonteret.setIdTipoInfraccion(new Long(
						this.operdesmonteret.getIdTipoInfraccionStr()));

				getOperdesmonteretService().insert(this.operdesmonteret);
				msg = AppConstants.SUCCESS_CREATE;
			}
		} catch (OperDesmonteRetException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (OperDesmonteRetRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage(" Desmonte " + msg, null, null);
		return AppConstants.OPERDESMONTERET_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.operdesmonteret.getId() != null) {

				getOperdesmonteretService().update(this.operdesmonteret);
				msg = AppConstants.SUCCESS_UPDATE;
			}
		} catch (OperDesmonteRetException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (OperDesmonteRetRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("Desmonte " + msg, null, null);
		return AppConstants.OPERDESMONTERET_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createOperDesmonteRet() {
		operdesmonteret = new OperDesmonteRet();
		cleanValues();
		operdesmonteret.setId(null);
		operdesmonteret.setUsuarioCrea(getLoggedUserID());
		// cleanSearchValues();
		return AppConstants.OPERDESMONTERET_CREATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String updateOperDesmonteRet() {
		Map params = getExternalContext().getRequestParameterMap();
		String operdesmonteretDataIndex = (String) params
				.get("operdesmonteretDataIndex");
		this.operdesmonteret = (OperDesmonteRet) ((List) this.operdesmonteretListModel
				.getWrappedData()).get(Integer
				.parseInt(operdesmonteretDataIndex));
		// cleanSearchValues();
		this.operdesmonteret.setIdTipoDesmonteStr(this.operdesmonteret
				.getIdTipoDesmonte().toString());
		this.operdesmonteret.setIdTipoVentaStr(this.operdesmonteret
				.getIdTipoVenta().toString());
		this.operdesmonteret.setIdTipoInfraccionStr(this.operdesmonteret
				.getIdTipoInfraccion().toString());

		// Por defecto la base de datos devuelve un 0 en el Id, se debe hacer
		// null para que no haya problema con la FK
		if (this.operdesmonteret.getIdPermisoDep() != null) {
			String compare = this.operdesmonteret.getIdPermisoDep().toString();
			if (compare.equalsIgnoreCase("0")) {
				this.operdesmonteret.setIdPermisoDep(null);
			}
		}

		return AppConstants.OPERDESMONTERET_UPDATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String manageOperDesmonteRetElementos() {
		Map params = getExternalContext().getRequestParameterMap();
		String operdesmonteretDataIndex = (String) params
				.get("operdesmonteretDataIndex");
		this.operdesmonteret = (OperDesmonteRet) ((List) this.operdesmonteretListModel
				.getWrappedData()).get(Integer
				.parseInt(operdesmonteretDataIndex));
		// cleanSearchValues();
		String msg = "";
		List valores = null;
		try {
			valores = getDeselementoretenidoService().loadAll(this.operdesmonteret);
		} catch (DesElementoRetenidoException e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}

		this.deselementoretenidoController.getDeselementoretenidoListModel()
				.setWrappedData(valores);

		this.operdesmonteret.setIdTipoDesmonteStr(this.operdesmonteret
				.getIdTipoDesmonte().toString());
		this.operdesmonteret.setIdTipoVentaStr(this.operdesmonteret
				.getIdTipoVenta().toString());
		this.operdesmonteret.setIdTipoInfraccionStr(this.operdesmonteret
				.getIdTipoInfraccion().toString());

		return AppConstants.OPERDESMONTERET_LIST_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String cancelOperDesmonteRet() {
		cleanSearchValues();
		cleanValues();
		return AppConstants.OPERDESMONTERET_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * @return the operdesmonteretSearch
	 */
	public OperDesmonteRet getOperdesmonteretSearch() {
		return operdesmonteretSearch;
	}

	/**
	 * @param operdesmonteretSearch
	 *            the operdesmonteretSearch to set
	 */
	public void setOperdesmonteretSearch(OperDesmonteRet operdesmonteretSearch) {
		this.operdesmonteretSearch = operdesmonteretSearch;
	}

	/**
	 * @return the operdesmonteretListModel
	 */
	public DataModel getOperdesmonteretListModel() {
		return operdesmonteretListModel;
	}

	/**
	 * @param operdesmonteretListModel
	 *            the operdesmonteretListModel to set
	 */
	public void setOperdesmonteretListModel(DataModel operdesmonteretListModel) {
		this.operdesmonteretListModel = operdesmonteretListModel;
	}

	/**
	 * @return the operdesmonteret
	 */
	public OperDesmonteRet getOperdesmonteret() {
		return operdesmonteret;
	}

	/**
	 * @param operdesmonteret
	 *            the operdesmonteret to set
	 */
	public void setOperdesmonteret(OperDesmonteRet operdesmonteret) {
		this.operdesmonteret = operdesmonteret;
	}

	/**
	 * @return the operdesmonteretService
	 */
	public IOperDesmonteRetService getOperdesmonteretService() {
		return operdesmonteretService;
	}

	/**
	 * @param operdesmonteretService
	 *            the operdesmonteretService to set
	 */
	public void setOperdesmonteretService(
			IOperDesmonteRetService operdesmonteretService) {
		this.operdesmonteretService = operdesmonteretService;
	}

	/**
	 * @return the serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	/**
	 * @return the geoUbicacionClient
	 */
	public GeoUbicacionClient getGeoUbicacionClient() {
		return geoUbicacionClient;
	}

	/**
	 * @param geoUbicacionClient
	 *            the geoUbicacionClient to set
	 */
	public void setGeoUbicacionClient(GeoUbicacionClient geoUbicacionClient) {
		this.geoUbicacionClient = geoUbicacionClient;
	}

	/**
	 * @return the direccionLocal
	 */
	public BeanDireccion getDireccionLocal() {
		return direccionLocal;
	}

	/**
	 * @param direccionLocal
	 *            the direccionLocal to set
	 */
	public void setDireccionLocal(BeanDireccion direccionLocal) {
		this.direccionLocal = direccionLocal;
	}

	/**
	 * @return the deselementoretenidoService
	 */
	public IDesElementoRetenidoService getDeselementoretenidoService() {
		return deselementoretenidoService;
	}

	/**
	 * @param deselementoretenidoService
	 *            the deselementoretenidoService to set
	 */
	public void setDeselementoretenidoService(
			IDesElementoRetenidoService deselementoretenidoService) {
		this.deselementoretenidoService = deselementoretenidoService;
	}

	/**
	 * @return the deselementoretenidoController
	 */
	public DesElementoRetenidoController getDeselementoretenidoController() {
		return deselementoretenidoController;
	}

	/**
	 * @param deselementoretenidoController
	 *            the deselementoretenidoController to set
	 */
	public void setDeselementoretenidoController(
			DesElementoRetenidoController deselementoretenidoController) {
		this.deselementoretenidoController = deselementoretenidoController;
	}

	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

}
